#include "ai_glass_command.h"
#include "ai_glass_common.h"
#include "ai_glass_log.h"
#include <string.h>

/**
 * @brief 获取全局glass_fd文件描述符
 *
 * @return 文件描述符，-1表示无效
 */
static int get_glass_fd(void)
{
    extern int glass_fd;
    return glass_fd;
}

/**
 * @brief 发送命令到RTT端的简化接口
 *
 * 这个函数是set_glass_info_v4_notify的封装，提供了更简单的使用方式。
 * 用户只需要提供命令ID和值，函数会自动处理文件描述符和参数长度。
 *
 * @param cmd 命令ID
 * @param value 要发送的值
 * @param value_len 值的长度
 * @return 0 成功，-1 失败
 */
int send_glass_command(uint32_t cmd, const void *value, uint32_t value_len)
{
    int fd = get_glass_fd();
    if (fd < 0)
    {
        ai_glass_log_error("send_glass_command: invalid file descriptor (%d)", fd);
        return -1;
    }
    
    // 检查参数有效性
    if (value_len > 0 && value == NULL)
    {
        ai_glass_log_error("send_glass_command: invalid parameter (value is NULL but value_len > 0)");
        return -1;
    }
    
    // 调用set_glass_info_v4_notify发送命令
    int ret = set_glass_info_v4_notify(fd, cmd, (char *)value, value_len);
    if (ret < 0)
    {
        ai_glass_log_error("send_glass_command: failed to send command 0x%x", cmd);
        return -1;
    }
    
    ai_glass_log_debug("send_glass_command: command 0x%x sent successfully", cmd);
    return 0;
}

/**
 * @brief 发送整数命令到RTT端
 *
 * 这是一个更专门化的接口，用于发送整数值。
 *
 * @param cmd 命令ID
 * @param value 要发送的整数值
 * @return 0 成功，-1 失败
 */
int send_glass_command_int(uint32_t cmd, int value)
{
    return send_glass_command(cmd, &value, sizeof(int));
}

/**
 * @brief 发送字符串命令到RTT端
 *
 * 这是一个更专门化的接口，用于发送字符串值。
 *
 * @param cmd 命令ID
 * @param str 要发送的字符串
 * @return 0 成功，-1 失败
 */
int send_glass_command_string(uint32_t cmd, const char *str)
{
    if (str == NULL)
    {
        ai_glass_log_error("send_glass_command_string: string is NULL");
        return -1;
    }
    
    // 包含字符串的结束符
    return send_glass_command(cmd, str, strlen(str) + 1);
}